gtkprintjob: release the surface and backend before the output io channel
authorCarlos Garcia Campos <cgarcia@igalia.com>
Wed, 3 Oct 2012 17:24:52 +0000 (19:24 +0200)
committerCarlos Garcia Campos <carlosgc@gnome.org>
Sun, 14 Apr 2013 10:19:09 +0000 (12:19 +0200)
If the GtkPrintJob is freed too early when the surface has been created
but the job hasn't been sent to the printer, it's possible that the
file print backend tries to write to the io chaneel when it is already
closed. This produces runtime critical warnings:

GLib-CRITICAL **: g_io_channel_write_chars: assertion `channel->is_writeable' failed

https://bugzilla.gnome.org/show_bug.cgi?id=685420

gtk/gtkprintjob.c

index 49c664d88fcd5d228b8dd2a06841239d3f39c0ab..439b6686269825ce34c7e87b392037f152450081 100644 (file)
@@ -269,21 +269,21 @@ gtk_print_job_finalize (GObject *object)
   GtkPrintJob *job = GTK_PRINT_JOB (object);
   GtkPrintJobPrivate *priv = job->priv;
 
+  if (priv->surface)
+    cairo_surface_destroy (priv->surface);
+
+  if (priv->backend)
+    g_object_unref (priv->backend);
+
   if (priv->spool_io != NULL)
     {
       g_io_channel_unref (priv->spool_io);
       priv->spool_io = NULL;
     }
 
-  if (priv->backend)
-    g_object_unref (priv->backend);
-
   if (priv->printer)
     g_object_unref (priv->printer);
 
-  if (priv->surface)
-    cairo_surface_destroy (priv->surface);
-
   if (priv->settings)
     g_object_unref (priv->settings);